package top.jiangqiang.qianyi.data.handler;

import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.dromara.hutool.extra.spring.SpringUtil;
import top.jiangqiang.qianyi.common.crypto.EncryptService;

/**
 * 存入数据库时加密  @TableField(typeHandler = EncryptionTypeHandler.class)
 * 必须使用Mybatis plus join的链式查询，否则导致查询时解密失效。此外，查询时下面这种写法会导致自动解密失效
 * 1.直接写查询的字段，例如：xxx.select("username")，正确写法应该是：AdminUser::getUsername
 * 2.使用Map接收查询的结果，例如：xxx.list(HashMap.class)
 * 3.加密字段作为查询条件时，需要手动加密。例如：.eq(AdminUser::getUsername, "0db3fee8274d2009781da133acdd3a16")
 * 4.更新时作为更新的值，需要手动加密。xxx.set(AdminUser::getUsername, "suixin").update();
 *
 * @author JiangQiang
 */
@Slf4j
@MappedTypes({Object.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class EncryptionTypeHandler extends AbstractJsonTypeHandler<String> {

    public EncryptionTypeHandler(Class<?> type) {
        super(type);
    }

    @Override
    public String parse(String json) {
        return SpringUtil.getBean(EncryptService.class).dbDecrypt(json);
    }

    @Override
    public String toJson(String obj) {
        return SpringUtil.getBean(EncryptService.class).dbEncrypt((String) obj);
    }

}
